﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;

namespace Common.Server
{
    interface IDespatchServer
    {
        void DispatchMessage(string sessionKey, string message);
    }

    /// <summary>
    /// 冒险岛服务器接口
    /// </summary>
    public class MapleServer : AppServer<MapleSession, MpaleRequestInfo>, IDespatchServer
    {
        public MapleServer()
            : base(new DefaultReceiveFilterFactory<MapleReceiveFilter, MpaleRequestInfo>())
        {
            //            •maxWorkingThreads: 线程池最大工作线程数量;
            //•minWorkingThreads: 线程池最小工作线程数量;
            //•maxCompletionPortThreads: 线程池最大完成端口线程数量;
            //•minCompletionPortThreads: 线程池最小完成端口线程数量;
            //•disablePerformanceDataCollector: 是否禁用性能数据采集;
            //•performanceDataCollectInterval: 性能数据采集频率 (单位为秒, 默认值: 60);
            //• isolation: SuperSocket 服务器实例隔离级别 ◦None - 无隔离
            //◦AppDomain - 应用程序域级别的隔离，多个服务器实例运行在各自独立的应用程序域之中
            //◦Process - 进程级别的隔离，多个服务器实例运行在各自独立的进程之中

            //•logFactory: 默认logFactory的名字, 所有可用的 log factories定义在子节点 "logFactories" 之中， 我们将会在下面的文档中介绍它;
            //•defaultCulture: 整个程序的默认 thread culture，只在.Net 4.5中可用;


            //            •name: 服务器实例的名称;
            //•serverType: 服务器实例的类型的完整名称;
            //•serverTypeName: 所选用的服务器类型在 serverTypes 节点的名字，配置节点 serverTypes 用于定义所有可用的服务器类型，我们将在后面再做详细介绍;
            //• ip: 服务器监听的ip地址。你可以设置具体的地址，也可以设置为下面的值 Any - 所有的IPv4地址 IPv6Any - 所有的IPv6地址 
            //•port: 服务器监听的端口;
            //•listenBacklog: 监听队列的大小;
            //•mode: Socket服务器运行的模式, Tcp (默认) 或者 Udp;
            //•disabled: 服务器实例是否禁用了;
            //•startupOrder: 服务器实例启动顺序, bootstrap 将按照此值的顺序来启动多个服务器实例;
            //•sendTimeOut: 发送数据超时时间;
            //•sendingQueueSize: 发送队列最大长度, 默认值为5;
            //•maxConnectionNumber: 可允许连接的最大连接数;
            //•receiveBufferSize: 接收缓冲区大小;
            //•sendBufferSize: 发送缓冲区大小;
            //•syncSend: 是否启用同步发送模式, 默认值: false;
            //•logCommand: 是否记录命令执行的记录;
            //•logBasicSessionActivity: 是否记录session的基本活动，如连接和断开;
            //•logAllSocketException: 是否记录所有Socket异常和错误;
            //•clearIdleSession: true 或 false, 是否定时清空空闲会话，默认值是 false;
            //•clearIdleSessionInterval: 清空空闲会话的时间间隔, 默认值是120, 单位为秒;
            //•idleSessionTimeOut: 会话空闲超时时间; 当此会话空闲时间超过此值，同时clearIdleSession被配置成true时，此会话将会被关闭; 默认值为300，单位为秒;
            //•security: Empty, Tls, Ssl3. Socket服务器所采用的传输层加密协议，默认值为空; 你也可以设置多个值，如 "Tls11,Tls12";
            //•maxRequestLength: 最大允许的请求长度，默认值为1024;
            //•textEncoding: 文本的默认编码，默认值是 ASCII;
            //•defaultCulture: 此服务器实例的默认 thread culture, 只在.Net 4.5中可用而且在隔离级别为 'None' 时无效;
            //•disableSessionSnapshot: 是否禁用会话快照, 默认值为 false.
            //•sessionSnapshotInterval: 会话快照时间间隔, 默认值是 5, 单位为秒;
            //•keepAliveTime: 网络连接正常情况下的keep alive数据的发送间隔, 默认值为 600, 单位为秒;
            //•keepAliveInterval: Keep alive失败之后, keep alive探测包的发送间隔，默认值为 60, 单位为秒;

            //•certificate: 这各节点用于定义用于此服务器实例的X509Certificate证书的信息

            //this.Bootstrap


        }

        public IBootstrap getBootstrap()
        {
            return this.Bootstrap;
        }

        /// <summary>
        /// 只有频道服务器才需要去配置添加到世界服务器
        /// </summary>
        public void AddChannelServer()
        {
            //WorldServer.Server.MapleWorldServer
            //MapleGlobalData.MapleWorldData.m_ChannelList.Add(this.Bootstrap);
            //MapleGlobalData.MapleWorldData.AddChannel(this.Bootstrap);

        }



        protected override void OnStartup()
        {
            base.OnStartup();
        }

        protected override bool Setup(SuperSocket.SocketBase.Config.IRootConfig rootConfig, SuperSocket.SocketBase.Config.IServerConfig config)
        {
            //rootConfig.PerformanceDataCollectInterval
            //SuperSocket.SocketBase.Config.RootConfig r = new SuperSocket.SocketBase.Config.RootConfig();
            //r.Isolation = IsolationMode.Process;
            Console.WriteLine("服务器名称:" + config.Name);
            return base.Setup(rootConfig, config);
        }

        public override bool Start()
        {
            return base.Start();
        }


        public void DispatchMessage(string sessionKey, string message)
        {
            throw new NotImplementedException();
        }
    }
}
